package main

func main() {
	// 指针
	// 每个变量在内存中都有自己的地址 a 是地址的别名 地址对应这实际的值
	// var a = 10
	// fmt.Printf("%v,%T,%p", a, a, &a) // 从别名取地址用&

	// 指针也是一个变量 但是是一种特殊的变量，它存储的数据不是普通数值，而是一个变量的内存地址

	// a := 10                          // 变量都有自己的地址 a是别名 地址存储的是一个int类型值
	// var b *int = &a                  // 指针是特殊的变量 他自己也有地址 b 是 地址的别名 这个地址存储的是另一个地址 * intxx * floatxx等等
	// *b = 11                          // 使用存储的地址修改对应地址的值
	// fmt.Printf("%v,%T,%p", b, b, &b) // b 本身存储的一个变量的地址 指针类型 * int 因为是变量所以本身有个地址 b只是个别名

	// 取指针的值
	// var a = 10
	// b := &a
	// fmt.Println(*b) // b 的地址保存a的地址 取地址对应的值 *xxx  修改也是 *xxx=xxx  * 取出地址对应的值  & 取地址

	// 形参接受指针 (a * int) *a = xxx 传入使用 &a

	// new make

	// 指针需要开辟内存空间才能用

	// var s map[string]string // 引用类型，没开辟空间就赋值报错 用make开辟
	// s["a"] = "aa"
	// fmt.Println(s)

	// var a *int //报错 这时候a实际地址没有保存地址所以直接引用就错了。a实际地址没有存储开辟空间的地址。
	// *a = 100
	// fmt.Println(*a)

	// 用new 给指针分配内存
	// a := new(int) // 创建一个int的指针类型并且分配内存
	// *a = 13       // 值*a
	// fmt.Printf("%v,%T,%p", a, a, &a) // 开辟的地址 *int a 别名的地址

	//  这个就对了先声明在申请内存
	// var a *int
	// a = new(int)
	// *a = 123
	// fmt.Println(*a)

	// 指针用new来分配 返回指针类型

	// slice map channel用make 返回引用类型

}
